package alejandro.celulares
import scala.collection.mutable.ListBuffer

/*
 * La clase contiene todo lo referente a la estructura del cliente
 * getters, setters y métodos que permiten agregar instancias a una coleccion
 */

abstract class ClienteEstructura (nombreP: String, numeroP: Long, planP: PlanDePago) {

    var plan: PlanDePago = planP
	var nombre: String = nombreP
	var numero: Long = numeroP
	var llamadasLocales: ListBuffer[LlamadaLocal] = ListBuffer[LlamadaLocal]()
    var llamadasLargas: ListBuffer[LlamadaLarga] = ListBuffer[LlamadaLarga]()
	var mensajesTexto: ListBuffer[MensajeDeTexto] = ListBuffer[MensajeDeTexto]()
		
	def getNombre():String = nombre
	def setNombre(nombreP: String) = {
	    nombre = nombreP
	}
    
    def getPlan():PlanDePago = plan
	def setPlan(planP: PlanDePago) = {
	    plan = planP
	}
	
	def getNumero():Long = numero
	def setNumero(numeroP: Long) = {
	    numero = numeroP
	}
	
	def setNumerosAmigo(numeroAmigoP: Long, posicion: Integer) = {
	    plan.setNumerosAmigo(numeroAmigoP, posicion)
	}
	
	def setCiudadAmiga(ciudadAmigaP: Localidad) = {
	    plan.setCiudadAmiga(ciudadAmigaP)
	} 
	
	def agregarLlamadaLocal(comunicacion: LlamadaLocal): LlamadaLocal = {
	  llamadasLocales append comunicacion
	  comunicacion
	}
	
	def agregarLlamadaLarga(comunicacion: LlamadaLarga): LlamadaLarga = {
	  llamadasLargas append comunicacion
	  comunicacion
	}
	
	def agregarMensajeDeTexto(comunicacion: MensajeDeTexto): MensajeDeTexto = {
	  mensajesTexto append comunicacion
	  comunicacion
	}
	
	def getLlamadasLocalesMesAnio(mes: Integer, anio: Integer): ListBuffer[LlamadaLocal] = {
	  llamadasLocales.filter(a => a.esMesYAnio(mes, anio))	  
	}
	
	def getLlamadasLargasMesAnio(mes: Integer, anio: Integer): ListBuffer[LlamadaLarga] = {
	  llamadasLargas.filter(a => a.esMesYAnio(mes, anio))	  
	}
	
	def getMensajesTextoMesAnio(mes: Integer, anio: Integer): ListBuffer[MensajeDeTexto] = {
	  mensajesTexto.filter(a => a.esMesYAnio(mes, anio))	  
	}
	
	def getLlamadasMesAnio(mes: Integer, anio: Integer):ListBuffer[LlamadaLocal] = {
	    val returned = getLlamadasLocalesMesAnio(mes, anio)
	    returned appendAll (getLlamadasLargasMesAnio(mes, anio))
	    returned
	}
	
	def getComunicacionesMesAnio(mes: Integer, anio: Integer):ListBuffer[Comunicacion] = {
	    Comunicacion.joinComunicaciones(
	        getMensajesTextoMesAnio(mes, anio),
	        getLlamadasLocalesMesAnio(mes, anio),
	        getLlamadasLargasMesAnio(mes, anio)
	        )
	}	
	
	def getMensajesTextoMesAnioDupli(mes: Integer, anio: Integer): ListBuffer[MensajeDeTexto] = {	
      getMensajesTextoMesAnio(mes, anio).collect{
        case com => com.duplicate().generarPrecioConDescuento()
      }
	}
    
	def getLlamadasLargasMesAnioDupli(mes: Integer, anio: Integer): ListBuffer[LlamadaLarga] = {	
      getLlamadasLargasMesAnio(mes, anio).collect{
        case com => com.duplicate().generarPrecioConDescuento()
      }
	}
	
	def getLlamadasLocalesMesAnioDupli(mes: Integer, anio: Integer): ListBuffer[LlamadaLocal] = {	
      getLlamadasLocalesMesAnio(mes, anio).collect{
        case com => com.duplicate().generarPrecioConDescuento()
      }
	}
	
		
    override def toString():String = {
    	"" + super.toString() + "[" + nombre + " - " + numero + "]"
	}
	
}